<script>
import {
	getToken
} from './utils/auth'
export default {
	onLaunch: function () {
		console.log('App Launch')
		const token = getToken()
		console.log(uni.$uv);

		uni.getPushClientId({
			success(res) {
				console.log(res, "客户端12121");
			}
		})
		uni.onPushMessage((res) => {
			console.log("收到推送消息：", res) //监听推送消息

			// 处理推送消息点击事件
			this.handlePushMessage(res)
		})
		if (token) {
			// 如果已登录，立即加载用户信息到 store
			this.loadUserInfoToStore()
		}
		//  #ifdef APP-PLUS
		// 应用启动时，清除所有未读消息和角标
		this.clearBadge()
		this.clearAllPushMessages()
		//  #endif
	},
	onShow: function () {
		console.log('App Show')
		//  #ifdef APP-PLUS
		// 从后台切回前台时，清除所有未读消息和角标
		this.clearBadge()
		this.clearAllPushMessages()
		//  #endif
	},
	onHide: function () {
		console.log('App Hide')
	},
	methods: {
		/**
		 * 加载用户信息到 store
		 */
		async loadUserInfoToStore() {
			try {
				console.log('App启动 - 开始加载用户信息到 store')
				await this.$store.dispatch('user/getUserMsg')
				console.log('App启动 - 用户信息已加载到 store')
			} catch (error) {
				console.error('App启动 - 加载用户信息失败:', error)
			}
		},

		/**
		 * 清除应用角标数字
		 */
		clearBadge() {
			try {
				// 清除角标，设置为 0
				plus.runtime.setBadgeNumber(0)
				console.log("角标已清除");
			} catch (error) {
				console.error("清除角标失败:", error);
			}
		},
		
		/**
		 * 清除系统通知栏所有推送消息
		 */
		clearAllPushMessages() {
			try {
				// 清除系统通知栏的所有推送消息
				plus.push.clear()
				console.log("系统通知栏消息已清除");
			} catch (error) {
				console.error("清除推送消息失败:", error);
			}
		},
		
		/**
		 * 判断路径是否为 tabBar 页面
		 * @param {String} path - 页面路径
		 * @returns {Boolean} 是否为 tabBar 页面
		 */
		isTabBarPage(path) {
			if (!path || typeof path !== 'string') {
				return false
			}
			
			// 定义所有 tabBar 页面路径
			const tabBarPages = [
				'pages/index/index',
				'pages/tactics/tactics',
				'pages/progress/progress',
				'pages/data/index',
				'pages/my/my'
			]
			
			// 去除路径开头的 '/' 和查询参数
			const cleanPath = path.replace(/^\/+/, '').split('?')[0].trim()
			
			// 检查是否在 tabBar 页面列表中
			return tabBarPages.includes(cleanPath)
		},
		
		/**
		 * 处理推送消息
		 * @param {Object} res - 推送消息对象
		 */
		handlePushMessage(res) {
			try {
				// 无论什么类型的推送，都清除角标和通知
				//  #ifdef APP-PLUS
				this.clearBadge()
				this.clearAllPushMessages()
				//  #endif

				// 检查是否是点击类型的推送
				if (res.type !== 'click') {
					return
				}

				// 获取推送数据
				const data = res.data || {}
				let path = data.path
				let payload = data.payload

				// 验证 path 是否存在且为字符串
				if (!path || typeof path !== 'string') {
					console.error('推送路径无效:', path)
					return
				}

				// 去除 path 前后的空格
				path = path.trim()

				// 再次验证 trim 后的 path 是否为空
				if (!path) {
					console.error('推送路径为空')
					return
				}

				// 确保 payload 是对象
				if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
					payload = {}
				}

				// 判断是否为 tabBar 页面
				const isTabBar = this.isTabBarPage(path)

				// 确保路径以 '/' 开头
				if (!path.startsWith('/')) {
					path = '/' + path
				}

				let url = path

				// 如果不是 tabBar 页面，才可以添加查询参数
				if (!isTabBar && Object.keys(payload).length > 0) {
					// 检查 uni.$uv 是否存在
					if (uni.$uv && typeof uni.$uv.queryParams === 'function') {
						const queryString = uni.$uv.queryParams(payload)
						url = `${path}?${queryString}`
					} else {
						// 手动构建查询字符串
						const queryParts = []
						for (const key in payload) {
							if (payload.hasOwnProperty(key)) {
								const value = payload[key]
								if (value !== null && value !== undefined) {
									queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
								}
							}
						}
						if (queryParts.length > 0) {
							url = `${path}?${queryParts.join('&')}`
						}
					}
				}

				// 延迟跳转，确保应用已经完全启动
				setTimeout(() => {
					if (isTabBar) {
						// tabBar 页面使用 switchTab
						uni.switchTab({
							url: path,
							fail: (err) => {
								console.error('跳转失败:', err)
								uni.showToast({
									title: '页面跳转失败',
									icon: 'none',
									duration: 2000
								})
							}
						})
					} else {
						// 普通页面使用 navigateTo
						uni.navigateTo({
							url: url,
							fail: (err) => {
								console.error('跳转失败:', err)
								// 如果 navigateTo 失败，尝试使用 reLaunch
								uni.reLaunch({
									url: url,
									fail: (err2) => {
										console.error('重新跳转失败:', err2)
										uni.showToast({
											title: '页面跳转失败',
											icon: 'none',
											duration: 2000
										})
									}
								})
							}
						})
					}
				}, 300)

			} catch (error) {
				console.error('推送处理异常:', error)
				uni.showToast({
					title: '推送处理异常',
					icon: 'none',
					duration: 2000
				})
			}
		}
	}
}
</script>

<style lang="scss">
@import '@/styles/index.scss';
@import '@climblee/uv-ui/index.scss';
</style>